//============================================================================
// Nome        : Interfaces.cpp
// Autores     : T1G7
//                                      Felipe Galvão do Espírito Santo
//                                      Ivanilda Maísa Costa Brazão de Almeida
//                                      Paulo Jorge de Faria dos Reis
// Versão      : 1.0
// Data        : Maio de 2011
// Copyright   : Creative Commons 2.0
// Descrição   : CAL 2011 - TG1
//               Tema 12 - Transporte de pacientes de uma clínica de saúde.
//============================================================================

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <queue>
#include "Interfaces.h"
#include <ctype.h>
#include <cstring>

using std::cin;
using std::cout;
using std::flush;
using std::endl;
using std::string;
using std::setw;
using std::string;

//! Construtor da classe de Interface.
/*!
 *  Trata-se de um construtor vazio, pois serve apenas para a instânciação do objecto e permitir o acesso às suas funções
 */
Interfaces::Interfaces()
{
}

//! Destrutor da classe de Interface
Interfaces::~Interfaces()
{
}

//! Permite passar uma referência dos dados para a Interface
void Interfaces::ligarDados(Dados& _pDados)
{
	pDados = &_pDados;

}

//! Permite enviar uma string para a interface.
void Interfaces::sms(string mensagem)
{
	cout << mensagem << endl;
}

string Interfaces::smsRetorno(string pergunta)
{
	string resposta;
	cout << pergunta << endl;
	getline(cin, resposta);
	return resposta;
}

string Interfaces::smsRetornoNumeros(string pergunta)
{
	const char * aTestar;
	int erro=0;

	string resposta;
	cout << pergunta << endl;
	getline(cin, resposta);
	aTestar = resposta.c_str();
	int tamanho = strlen(aTestar);
	for(int i = 0; i < tamanho; i++ )
	{
		if (!isdigit(aTestar[i]))
		{
			if (aTestar[i] == '.' || aTestar[i] == ',') erro++;
			else erro += 2;
		}
	}
	if (erro > 2)
	{
		cout << "Introduziu um valor errado, será devolvido zero(0)" << endl;
		resposta = "0";
	}

	return resposta;
}

//! Função que limpa o ecrã (já que o system("cls") não funciona muito bem na consola do eclipse)
void Interfaces::limpaEcra()
{
  for(unsigned int i = 0; i < 4; i++)
    cout << '\n';
  cout << flush;
}

//! Construtor genérico de menus.
/*! Recebe um vector de strings por referência, e dois caracteres.
 *  Verifica o tamanho da maior string e apresenta todas as strings envolvidas
 *  por uma caixa formada pelo caracter enviado.
 */
void Interfaces::menuNaConsola(vector<string>& linhasDoMenu, char vertical, char horizontal)
{
	int linhas = linhasDoMenu.size();	//! Número de linhas em opcoes.
	unsigned int max = 0;				//! Tamanho da maior string existente em opcoes.
	for(int i = 0; i < linhas; i++)		//! Verificar o tamanho da maior linha.
	{
		if(max < linhasDoMenu[i].size()) max = linhasDoMenu[i].size();
	}
	cout << endl;						//! Uma linha de intervalo.
	cout << string(max + 4, horizontal) << endl;	//! Uma linha horizontal para começar.
	for(int i = 0; i < linhas; i++)					//! Apresentação das linhas.
	{
		if(linhasDoMenu[i] == "separador")
		{
			cout << string(max + 4, horizontal) << endl;	//! Outra linha horizontal para separar areas do menu.
		}
		else
		{
			cout << vertical << " " << setw(max) << left << linhasDoMenu[i] << " " << vertical << endl;
		}
	}
	cout << string(max + 4, horizontal) << endl;	//! Mais uma linha horizontal para terminar.
}

void Interfaces::ajuda(string menu)
{
	if(menu == "menuPrincipal")
	{
		cin.ignore(10,'\n');
		cout << "Escolha a opção que pretende, utilize 0 para sair da aplicação." << endl;
		// TODO Implementar espera por tecla.
		cout << "Prima qualquer tecla para continuar." << flush;
		cin.get();	// Serve para avançar apenas quando se carregar numa tecla (+ ENTER).
		limpaEcra();
	}
}
